#include "IteradorArchivos.h"
using namespace std;
IteradorArchivos::IteradorArchivos(string& ruta) {
   ruta = corregirRuta(ruta);
   cambiarDirectorioActual(ruta);
   this->actualizarSiguiente();
}
IteradorArchivos::~IteradorArchivos() {
   if (dp != NULL) {
      closedir(dp);
   }
}

std::string IteradorArchivos::corregirRuta(std::string& ruta) {
	size_t posRef;
	std::stringstream rutaAux("");
	if (((posRef = ruta.find_first_of(".")) != ruta.npos) && posRef == 1) {
		char buffer[512];
		rutaAux<<getcwd(buffer, -1)<<ruta.substr(2);
		ruta = rutaAux.str();
	}
	return ruta;
}

string IteradorArchivos::siguiente() {
   string archivo("");
   if (entryNext) {
	  archivo =  directorioActual;
	  archivo.append("/");
      archivo.append(entryNext->d_name);
      this->actualizarSiguiente();
   }
   return archivo;
}

bool IteradorArchivos::tieneSiguiente() {
   return entryNext;
}

void IteradorArchivos::actualizarSiguiente() {
	struct stat statvar;
	bool encuentreArchivo = false;
	bool recorridoTotalDirectorios = false;
	while (!encuentreArchivo && !recorridoTotalDirectorios && dp) {
		entryNext = readdir(dp);
		if (entryNext) {
			string subRuta = this->directorioActual;
			subRuta.append("/");
			subRuta.append(entryNext->d_name);
			stat(subRuta.c_str(), &statvar);
			if (S_ISREG(statvar.st_mode)) {
				encuentreArchivo = true;
			} else {
				string subDirectorio = entryNext->d_name;
				if (subDirectorio.compare(".") && subDirectorio.compare("..")) {
					this->directorios.Anadir(subRuta);
				}
			}
		} else {
			if (directorios.haySiguiente()) {
				string nuevaRuta = directorios.Leer();
				cambiarDirectorioActual(nuevaRuta);
			} else {
				recorridoTotalDirectorios = true;
			}
		}
	}
}

void IteradorArchivos::cambiarDirectorioActual(string& ruta) {
	std::cout<<ruta<<endl;
	if (dp != NULL) {
	   closedir(dp);
	}
	dp = opendir(ruta.c_str());
	directorioActual = ruta;
}
